package xyz.xuminghai.javafx_learn.scene.shape.shape3D;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

/**
 * 2023/8/17 15:51 星期四<br/>
 * MeshView类定义具有指定 3D 网格数据的表面。
 *
 * @author xuMingHai
 */
public class MeshViewApp extends Application {

    private final Group root = new Group();


    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void init() {
        // 等边三角形边长
        double width = 100.0;
        // 高度 = （斜边长度的平方 - 直角边长度的平方）的平方根
        double height = Math.sqrt(Math.pow(width, 2.0) - Math.pow((width / 2.0), 2.0));
        float w = (float) width;
        float w2 = w / 2;
        float h = (float) height;
        // 顶点坐标
        float[] points = {
                w2, 0, w2,  // P0
                w, h, 0,   // P1
                0, h, 0,   // P2
                w2, h, w   // P4
        };

        // 纹理坐标
        float[] texCoords = {
                0, 0,
                1, 1,
                0, 1
        };

        int[] faces = {
                // 第1个三角形的顶点和纹理索引位置
                0, 0, 1, 1, 2, 2,
                // 第2个三角形的顶点和纹理索引位置
                0, 0, 2, 1, 3, 2,
                // 第3个三角形的顶点和纹理索引位置
                0, 0, 1, 1, 3, 2,
                // 第4个三角形的顶点和纹理索引位置
                1, 0, 2, 1, 3, 2,
        };
        TriangleMesh triangleMesh = new TriangleMesh();
        triangleMesh.getPoints().addAll(points);
        triangleMesh.getTexCoords().addAll(texCoords);
        triangleMesh.getFaces().addAll(faces);
        MeshView meshView = new MeshView(triangleMesh);
        meshView.setRotationAxis(Rotate.Y_AXIS);
        meshView.setRotate(30.0);
        root.getChildren().add(meshView);
        root.relocate(100.0, 100.0);
    }

    public void start(Stage primaryStage) {
        primaryStage.setTitle(getClass().getSimpleName());
        Scene scene = new Scene(root, 800, 600, true, SceneAntialiasing.BALANCED);
        // 设置透视相机
        scene.setCamera(new PerspectiveCamera());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}
